use std::fs::File;
use std::io;
use std::io::{ErrorKind, Read};

fn main() {
    println!("Hello, world!");


    //Result


    // let f = File::open("/root/rust_demo/p39_error/file.txt");
    //
    //
    // let file = match f {
    //     Ok(f) => f,
    //
    //     Err(e) => match e.kind() {
    //         //匹配不同的错误
    //         ErrorKind::NotFound => panic!("文件不存在"),
    //
    //         otherError => panic!("其他错误")
    //     }
    // };


    // unwrap

    // 如果 是Ok  ， unwrap 返回 Ok中的值， 如果是Err， unwrap 返回Err 中的错误

    // 但是unwrap 不能自定义错误信息
    // let f = File::open("/root/rust_demo/p39_error/file.txt").unwrap();


    // expect   和 unwrap类似


    let f = File::open("/root/rust_demo/p39_error/file.txt")
        .expect("文件不存在");


    //  ? 简化代码
}

#[test]
fn test11() {
    let context = read_context_from_file2().expect("读取失败");

    println!("文件内容 ：{}", context);
}


fn read_context_from_file() -> Result<String, io::Error> {
    let f = File::open("/root/rust_demo/p39_error/file.txt");


    let file = match f {
        Ok(ref f1) => f1,
        Err(error) => return Err(error)
    };

    let mut msg = String::new();

    match f?.read_to_string(&mut msg) {
        Ok(_) => Ok(msg),
        Err(error) => return Err(error),
    }
}


fn read_context_from_file2() -> Result<String, io::Error> {
    let mut f = File::open("/root/rust_demo/p39_error/file.txt")?;
    
    let mut msg = String::new();

    f.read_to_string(&mut msg)?;

    Ok(msg)
}